/*
 * @Descripttion: 对点云处理的封装,最后封装为消息
 * @version: 1.0版本
 * @Author: Frank.Wu
 * @Date: 2019-12-02 00:15:10
 * @LastEditors: Frank.Wu
 * @LastEditTime: 2021-04-18 16:05:51
 */

#ifndef COMSUMER_H_
#define COMSUMER_H_
 
#include <stdio.h>
#include <vector>
#include <map>
#include <string>

#include "../LidarGeometry/Geometry.h"

using namespace std;
using namespace GeometryLas;

/**
 * 点云处理算法的封装基类,所有的封装的过程都是输入路径,输出路径的模式
 **/ 
class LidarAlgorithmWapper
{
public:
    /**
     * 封装的运行Run函数
     **/ 
    virtual long AlgorithmWapperRun() = 0;

    /**
     * 从json字符串中解析出算法需要的参数
     **/ 
    virtual void AlgorithmExtractParamJson(string jsonParams) = 0;
    

private:
    string lidar_path_in;
    string lidar_path_out;
};


/**
 * 点云分类算法的封装,相对于点云处理基类
 * 点云分类算法封装需要添加一些参数,因此设置了设置参数的函数
 **/ 
class LidarClassificationmWapper:public LidarAlgorithmWapper
{
public:
    LidarClassificationmWapper()
    {

    }

    virtual long AlgorithmWapperRun();


    virtual void AlgorithmExtractParamJson(string jsonParams);


    /**
     * 设置点云分类算法的参数;
     * 值得注意的是本方法的分类是对分档后的每一档的点云进行分类
     * 不支持多档处理,所以在处理过程中首先需要对点云进行分档
     **/ 
    void AlgorithmSetParams(Point2Ds towerPnts,double towerRange,double lineHeight,double groundRectRange,double groundDisThres,double groundAngleThres);

private:
    /**
    * 相关参数信息
    **/ 
    Point2Ds m_towierPnts;
    double m_towerRange;
    double m_lineHeight;
    double m_groundRectRange;
    double m_groundDisThres;
    double m_groundAngleThres;
};

//TODO:添加其他相关算法


/**
 * 实现消费者方法
 **/ 
class LidarComsumer
{
public:
    void LidarComsumer_Run();
}



#endif